package main

import (
	"fmt"
	"time"
)

func main() {
	// 使用select 可以解决从管道取数据的阻塞问题

	// 1. 定义一个管道 10 个数据int
	intChan := make(chan int ,10)
	for i:=0;i<10; i++{
		intChan <- i
	}

	// 2.定义 一个管道 5个数据
	stringChan := make(chan string,5)
	for i:=0;i<5;i++{
		stringChan <-"hello"+fmt.Sprintf("%d",i)
	}

	// 传统的方法在遍历管道时，如果不关闭会阻塞而导致 deadlock

	// 问题，在实际开发中，可能我们不好确定什么时候关闭该管道

	// label:
	for {
		select {
			case v:=<- intChan: 
		// 注意：这里如果intChan 一直没有关闭，不会一直阻塞而deadLock
				fmt.Printf("从intChan读取的数据%d\n",v)
			case v := <- stringChan:
				fmt.Printf("从stringChan读取的数据%s]\n",v)
			default:
				fmt.Printf("都取不到，不玩了，程序员可以加入自己的逻辑\n")
				time.Sleep(time.Second)
				return  // 可以退出程序 ，后面其他的程序也都不执行了
				// break label // 可以退出 for

		}
	}
}